﻿#pragma warning(disable: 4996)
#pragma warning(disable: 6031)

/*
所谓“螺旋方阵”，是指对任意给定的N，将1到N×N的数字从左上角第1个格子开始，按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。

输入格式：
输入在一行中给出一个正整数N（<10）。

输出格式：
输出N×N的螺旋方阵。每行N个数字，每个数字占3位。

输入样例：
5
输出样例：
  1  2  3  4  5
 16 17 18 19  6
 15 24 25 20  7
 14 23 22 21  8
 13 12 11 10  9
*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


typedef struct TContext_s
{
	int n;
	int data[10][10];
}TContext;

TContext context;

void read_data(TContext* ctx)
{
	scanf("%d", &ctx->n);
}

void dump(TContext* ctx)
{
	for (int i = 0; i < ctx->n; ++i) {
		for (int j = 0; j < ctx->n; ++j)
			printf("%3d", ctx->data[i][j]);
		printf("\n");
	}
}

typedef struct Box_s
{
	int l;
	int r;
	int t;
	int b;
	int edge;
}Box;

void build_spiral_matrix(TContext* ctx)
{
	int i = 0;
	int j = 0;
	int k = 0;
	Box box = { 0,ctx->n - 1,0,ctx->n - 1 };

	int size = ctx->n * ctx->n;
	for (int k = 0; k < size; ++k)
	{
		ctx->data[i][j] = k + 1;
		switch (box.edge) {
		case 0:
			if (j < box.r)
				++j;
			else {
				++box.edge;
				++box.t;
				++i;
			}
			break;
		case 1:
			if (i < box.b)
				++i;
			else {
				++box.edge;
				--box.r;
				--j;
			}
			break;
		case 2:
			if (j > box.l)
				--j;
			else {
				++box.edge;
				--box.b;
				--i;
			}
			break;
		case 3:
			if (i> box.t)
				--i;
			else {
				box.edge=0;
				++box.l;
				++j;
			}
			break;
		}
	}
}

void solve(TContext* ctx)
{
	read_data(ctx);
	build_spiral_matrix(ctx);
	dump(ctx);
}

int main()
{
	freopen("D:/Develop/GitRepos/MOOC/浙江大学/数据结构/201906/DataStructure/M2019秋C入门和进阶练习集/7-90.txt", "r", stdin);
	solve(&context);
	return 0;
}
